package visitor;

import tree.*;

public class IRTreePrint {

	public void visit( BINOP n ){
		System.out.print("BINOP(");
		
		switch(n.binop){
			case BINOP.PLUS:
				System.out.print("PLUS");
				break;
			case BINOP.MINUS:
				System.out.print("MINUS");
				break;
			case BINOP.MUL:
				System.out.print("MUL");
				break;
			case BINOP.DIV:
				System.out.print("DIV");
				break;
			case BINOP.AND:
				System.out.print("AND");
				break;
			case BINOP.OR:
				System.out.print("OR");
				break;
			case BINOP.LSHIFT:
				System.out.print("LSHIFT");
				break;
			case BINOP.RSHIFT:
				System.out.print("RSHIFT");
				break;
			case BINOP.ARSHIFT:
				System.out.print("ARSHIFT");
				break;
			case BINOP.XOR:
				System.out.print("XOR");
				break;
		}
		n.left.accept(this);
		System.out.print(",");
		n.right.accept(this);
		System.out.print(")");
	}
	
	public void visit( CALL n ){
		System.out.print("CALL(");
		n.func.accept(this);
		System.out.print(",");
		System.out.print("[");
		tree.ExpList args = n.args;
		while( args != null ){
			args.head.accept(this);
			args = args.tail;
			if( args!= null)
				System.out.print(",");
				
		}
		System.out.print("]");
		System.out.print(")");
		
	}
	
	public void visit( CJUMP n ){
		System.out.print("CJUMP(");
		
		switch(n.relop){
		case CJUMP.EQ:
			System.out.print("EQ");
			break;
		case CJUMP.GE:
			System.out.print("GE");
			break;
		case CJUMP.GT:
			System.out.print("GT");
			break;
		case CJUMP.LE:
			System.out.print("LE");
			break;
		case CJUMP.LT:
			System.out.print("LT");
			break;
		case CJUMP.NE:
			System.out.print("NE");
			break;
		case CJUMP.UGE:
			System.out.print("UGE");
			break;
		case CJUMP.UGT:
			System.out.print("UGT");
			break;
		case CJUMP.ULE:
			System.out.print("ULE");
			break;
		case CJUMP.ULT:
			System.out.print("ULT");
			break;
		}
		
		System.out.print(",");
		n.left.accept(this);
		System.out.print(",");
		n.right.accept(this);
		System.out.print(",");
		System.out.print("LABEL("+n.iftrue.toString()+")");
		System.out.print(",");
		System.out.print("LABEL("+n.iffalse.toString()+")");
		System.out.print(")");
		
	}
	
	public void visit( CONST n ){
		System.out.print("CONST(");
		System.out.print(n.value);
		System.out.print(")");		
	}
	
	public void visit( ESEQ n ){		
		System.out.print("ESEQ(");
		n.stm.accept(this);
		System.out.print(",");
		n.exp.accept(this);
		System.out.print(")");	
		
	}
	
	public void visit( EXP n ){
		System.out.print("EXP(");
		n.exp.accept(this);
		System.out.print(")");		
	}
	
	public void visit( JUMP n ){
		System.out.print("JUMP(");
		n.exp.accept(this);
		System.out.print(")");
		
	}
	
	public void visit( LABEL n ){
		System.out.print("LABEL(");
		System.out.print(n.label.toString());
		System.out.print(")");
	}
	
	public void visit( MEM n ){
		System.out.print("MEM(");
		n.exp.accept(this);
		System.out.print(")");
	}
	
	public void visit( MOVE n ){
		System.out.print("MOVE(");
		n.dst.accept(this);
		System.out.print(",");
		n.src.accept(this);
		System.out.print(")");
		
	}
	
	public void visit( NAME n ){
		System.out.print("LABEL(");
		System.out.print(n.label.toString());
		System.out.print(")");	
	}
	
	public void visit( SEQ n ){
		System.out.print("SEQ(");
		n.left.accept(this);
		System.out.print(",");
		n.right.accept(this);
		System.out.print(")");
	}
	
	public void visit( TEMP n ){
		System.out.print("TEMP(");
		System.out.print(n.temp.toString());
		System.out.print(")");
	}
	
}
